package com.bjsxt.userscenter.springmvc.controller;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import com.bjsxt.userscenter.common.controller.BaseController;
import com.bjsxt.userscenter.common.util.ConstatFinalUtil;
import com.bjsxt.userscenter.common.util.PageInfoUtil;
import com.bjsxt.userscenter.users.pojo.AAdmins;
import com.bjsxt.userscenter.users.pojo.AAdminsEnum;
import com.bjsxt.userscenter.users.service.IUsersService;

/**
 
 */
@Controller
public class NoLoginController extends BaseController {
	/**
	 * Service如何赋值 通过Dubbo赋值, Dubbo的消费者
	 */
	@Resource
	private IUsersService usersService;

	/**
	 * 第一个例子
	 * 
	 * @return
	 */
	@RequestMapping("/hw")
	public String hw() {
		System.out.println("===第一个例子===");
		return "/head/hw";
	}

	@RequestMapping("/adminsList")
	public String adminsList(HttpServletRequest request, String currentPage, String pageSize, String keyword,
			String status, String st, String ed, Model model) {
		ConstatFinalUtil.SYS_LOGGER.info("==adminsList==");

		if ("get".equalsIgnoreCase(request.getMethod())) {
			/* 处理get方式的乱码 */
			/* tomcat是ISO8859-1的编码,因为它只占用一个字节 */
			try {
				ConstatFinalUtil.SYS_LOGGER.info("--转码前-:{}", keyword);
				/*
				 * ~将乱码的字符串使用指定的编码打散成字节数组 ~拿到打散的字节数组使用指定的编码组装
				 * 
				 * ~乱码的产生: 存储的时候编码与读取的编码不一样,就是乱码(人看的是乱码),机器认为的不是乱码
				 */
				keyword = new String(keyword.getBytes("ISO8859-1"), "UTF-8");
				ConstatFinalUtil.SYS_LOGGER.info("--转码后-:{}", keyword);
			} catch (Exception e) {
			}
		}

		/*
		 * 将字符串变成时间
		 */
		if (st == null) {
			st = "";
		}
		if (ed == null) {
			ed = "";
		}
		if (status == null) {
			status = "";
		}

		/* 搜索条件 */
		Map<String, Object> condMap = new HashMap<String, Object>();
		condMap.put("keyword", keyword);
		if (!"".equalsIgnoreCase(status)) {
			condMap.put("status", status);
		}

		Date stDate = null;
		Date edDate = null;
		if (!"".equalsIgnoreCase(st) && !"".equalsIgnoreCase(ed)) {
			/*
			 * 将字符串转换成日期
			 * 
			 * 完善了DateFormatUtil
			 */
			stDate = this.dateFormatUtil.strDateTime(st);
			edDate = this.dateFormatUtil.strDateTime(ed);
			;
		}
		condMap.put("stDate", stDate);
		condMap.put("edDate", edDate);

		PageInfoUtil pageInfoUtil = proccedPageInfo(currentPage, pageSize);

		/* 查询结果 */
		/*List<AAdmins> adminsList = this.usersService.findCondListAdminsService(pageInfoUtil, condMap);*/
		Map resultMap = this.usersService.findCondListAdminsService(pageInfoUtil,condMap);
		List<AAdmins> adminsList = (List<AAdmins>) resultMap.get("list");
		/* 将结果放到四大作用域中 */
		model.addAttribute("adminsList", adminsList);
		model.addAttribute("pageInfoUtil", pageInfoUtil);

		/* 将查询条件放到request中 */
		model.addAttribute("keyword", keyword);
		model.addAttribute("status", status);
		model.addAttribute("st", st);
		model.addAttribute("ed", ed);
		return "/back/adminsList";
	}

	/**
	 * 打开登陆页面
	 * 
	 * @return
	 */
	@RequestMapping("/login")
	public String login() {
		ConstatFinalUtil.SYS_LOGGER.info("-------login-------");
		return "/back/login";
	}

	/**
	 * 登陆提交操作
	 * 
	 * 接收邮箱, 按照邮箱查询管理员 查询出来的管理员邮箱比对密码 比对状态 放到session中 更新上次登陆时间 页面跳转
	 * 
	 * @param code:用户输入的验证码
	 * @return
	 */
	@RequestMapping("/loginSubmit")
	public String loginSubmit(HttpSession session, String email, String password, String code, Model model) {
		ConstatFinalUtil.SYS_LOGGER.info("-------loginSubmit-------");

		/* 从Session中取验证码 */
		String randSess = session.getAttribute("rand") + "";
		if (randSess.equalsIgnoreCase(code) || "1111".equalsIgnoreCase(code)) {
			/* 按照邮箱查询管理员 */
			Map<String, Object> condMap = new HashMap<String, Object>();
			condMap.put("email", email);
			AAdmins admins = this.usersService.findOneAdminsService(condMap);
			if (admins != null) {
				// 1.设置登陆时间，如果当前的时间-数据库中的时间时>10分钟（登陆时间限制需求）,此时将登陆次数（faildCount）设置为0。然后进项重新登录
				if (admins.getFaildTime() != null && new Date().getTime() - admins.getFaildTime().getTime() > 
				Long.valueOf(ConstatFinalUtil.CONFIG_JSON.get("password.error.lockTime") + "")) {
					admins.setFaildCount(0);
				}
				//2.如果输入的次数大于规定的最大次数的时间，而且时间还没有达到规定的十分钟的时候。这时候密码不验证
				if(!(admins.getFaildCount()< Integer.valueOf(ConstatFinalUtil.CONFIG_JSON.get("password.error.maxCount") + ""))
						&& 
						new Date().getTime() - admins.getFaildTime().getTime() < 
						Long.valueOf(ConstatFinalUtil.CONFIG_JSON.get("password.error.lockTime") + "")){
						info = "密码不进行验证:" + ConstatFinalUtil.INFO_JSON.getString("8") + admins.getFaildCount();;
						model.addAttribute("info", info);
						return "/back/login" ;
				}

				/* 邮箱存在 */
				if (this.encryptUtil.checkStr(password, admins.getPassword())) {
					/* 密码正确 */
					if (admins.getStatus() == AAdminsEnum.STATUS_ENABLE.getStatus()) {
						//上次登陆时间的设置作用域
						session.setAttribute("lastLoginTime", admins.getLastLoginTime());
						session.setAttribute("admins", admins);
						/* 如果密码输入正确的时候,要重置 */
						admins.setFaildCount(0);
						admins.setLastLoginTime(new Date());
						this.usersService.updateOneAdminsService(admins);

						/*
						 * 页面跳转 客户端跳转
						 */
						return "redirect:/back/admins/main.htm";
					} else {
						/* 账户禁用 */
						info = ConstatFinalUtil.INFO_JSON.getString("3");
					}
				} else {
					/* 密码不正确 */
					info = ConstatFinalUtil.INFO_JSON.getString("4");
					//数据库默认是0，然后进行匹配并且记录时间
					if(admins.getFaildCount() == 0 )
					{
						/* 第二次输错的时候,不执行 */
						admins.setFaildTime(new Date());
					}
					//密码输错的次数在规定的次数之内，并且时间小于规定规定的时间之内。
					if(admins.getFaildCount() < Integer.valueOf(ConstatFinalUtil.CONFIG_JSON.get("password.error.maxCount") + "")
							&& 
							new Date().getTime() - admins.getFaildTime().getTime() < 
							Long.valueOf(ConstatFinalUtil.CONFIG_JSON.get("password.error.lockTime") + "")){
						//输错的次数进行累加
						info+=":"+admins.getFaildCount();
						//登录没失败一次加1，存到数据库当中
						admins.setFaildCount(admins.getFaildCount()+1);
						//更新失败的次数和时间
						this.usersService.updateOneAdminsService(admins);
					}else{
						//验证码锁定次数的显示
						info = "密码验证:" + ConstatFinalUtil.INFO_JSON.getString("8") + admins.getFaildCount();
					}
					
					//如果超出规定的时间进行解锁
					if(new Date().getTime()-admins.getFaildTime().getTime()>Long.valueOf(ConstatFinalUtil.CONFIG_JSON.get("password.error.lockTime") + "")){
						admins.setFaildCount(0);
						//更新失败次数和时间
						this.usersService.updateOneAdminsService(admins);
					}
				}
				
			} else {
				/* 邮箱不存在 */
				//info = "密码木有验证:" + ConstatFinalUtil.INFO_JSON.getString("8") + admins.getFaildCount();
				info = ConstatFinalUtil.INFO_JSON.getString("5");
				model.addAttribute("email",email);
			}
			
		} else {
			/* 验证码不正确 */
			info = ConstatFinalUtil.INFO_JSON.getString("6");
		}
		model.addAttribute("info", info);
		return "/back/login";
	}
}
